package zhongbo.java.air.monitor.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import zhongbo.java.air.dictionary.model.AirPort;
import zhongbo.java.air.dictionary.model.AlertZone;
import zhongbo.java.air.monitor.model.FlightActivityDaily;

import java.util.Date;
import java.util.List;

/**
 * 说明：
 *
 * @author 钟波dellNotebook
 * @since 2025年04月08日 星期二 03:24:47
 */
@Mapper
public interface FlightActivityDailyMapper extends BaseMapper<FlightActivityDaily> {

    /**
     * 查询当天分组统计结果
     *
     * @param date 某一天的日期 如: 2025-04-08
     * @return 当天分组统计结果
     */
    @Select("SELECT \n" +
            "    a.icao_code AS icaoCode,\n" +          // ICAO 24位全球唯一飞机识别码（例：A0B1C2）
            "    MIN(a.timestamp) AS firstSeenTime,\n" + // 该航班当日首次被记录的时间（UTC时间）
            "    MAX(a.timestamp) AS lastSeenTime,\n" +  // 该航班当日最后一次被记录的时间（UTC时间）
            "    DATE(MIN(a.timestamp)) AS date,\n" +    // 统计日期（与输入参数#{date}保持一致）
            "    (\n" +
            "        SELECT altitude \n" +
            "        FROM air_flight_path \n" +
            "        WHERE icao_code = a.icao_code \n" + //   关联外部查询的ICAO码
            "        ORDER BY timestamp DESC \n" +       // 按时间降序获取最后记录
            "        LIMIT 1\n" +                       // 只取最新的一条
            "    ) AS lastAltitude,\n" +                // 最后一次记录时的海拔高度（单位：米）
            "    (\n" +
            "        SELECT latitude \n" +
            "        FROM air_flight_path \n" +
            "        WHERE icao_code = a.icao_code \n" +
            "        ORDER BY timestamp DESC \n" +
            "        LIMIT 1\n" +
            "    ) AS lastLatitude,\n" +                // 最后一次记录时的纬度（WGS84坐标系）
            "    (\n" +
            "        SELECT longitude \n" +
            "        FROM air_flight_path \n" +
            "        WHERE icao_code = a.icao_code \n" +
            "        ORDER BY timestamp DESC \n" +
            "        LIMIT 1\n" +
            "    ) AS lastLongitude,\n" +               // 最后一次记录时的经度（WGS84坐标系）
            "    (\n" +
            "        SELECT speed \n" +
            "        FROM air_flight_path \n" +
            "        WHERE icao_code = a.icao_code \n" +
            "        ORDER BY timestamp DESC \n" +
            "        LIMIT 1\n" +
            "    ) AS lastSpeed,\n" +                   // 最后一次记录时的地速（单位：节）
            "    (\n" +
            "        SELECT heading \n" +
            "        FROM air_flight_path \n" +
            "        WHERE icao_code = a.icao_code \n" +
            "        ORDER BY timestamp DESC \n" +
            "        LIMIT 1\n" +
            "    ) AS lastHeading,\n" +                 // 最后一次记录时的航向（0-359度，0=正北）
            "    COUNT(*) AS occurrenceCount\n" +       // 该航班当日被记录的次数（轨迹点数）
            "FROM air_flight_path a\n" +                //   数据源：航班轨迹表（别名a用于简化引用）
            "WHERE DATE(timestamp) = #{date}\n" +       //   核心条件：只查询指定日期的数据
            // #{date}格式必须为'YYYY-MM-DD'（例：'2025-04-08'）
            // DATE()函数提取日期部分进行比较
            "GROUP BY icao_code;\n")                   //   按ICAO码分组，每组生成一条统计记录
    // 注意：GROUP BY需包含所有非聚合字段（MySQL宽松模式允许不完整分组）
    List<FlightActivityDaily> selectDailyStats(String date);

@Select("SELECT COUNT(1) > 0 FROM air_flight_activity_daily WHERE icao_code = #{icaoCode} AND date = #{date}")
Boolean isUpOrAdd(@Param("icaoCode") String icao_code, @Param("date") String date);


@Select("SELECT id FROM air_flight_activity_daily WHERE icao_code = #{icaoCode}")
String queryActivityDailyId(String icaoCode);

@Select("SELECT * FROM air_Alert_zone")
List<AlertZone> alertZoneList();

@Select("SELECT * FROM air_flight_activity_daily")
List<FlightActivityDaily> flightActivityDailyList();
}
